#ifndef FONCTION_H
#define FONCTION_H

/*!
 * \file fonction.h
 * \brief Classe qui représente une fonction au sens LOBO, et contient la liste d'instructionsimple de la fonction
 * \author bruneau-hay
 * \version 0.1
 */

#include "fonctioncpp.h"
#include <sstream>

using namespace std;
class fonction 
{
private:
  
	vector<string> parametres;/*Les noms des paramètres de la fonction*/ 
	map <string,int> variables;/*Les variables déclarée + paramètres de la fonction, et leur initialisation */
	map <string,int> fonctions;/*Les fonctions déclarées avant la présente*/
	map<int,string[2]> vect_ins_string;/*Le Vecteur de chaine-instructionsimple LOBO, la clé est la ligne, string[2] correspond au type et inst*/
	fonctioncpp fonction_traduite;/*La fonction traduite*/
	int rang;/*La ligne à laquelle la fonction est déclarée*/
	bool valide;/*Valeur de validité de la fonction*/
	stringstream * flux_erreur;/*Le flux sur lequelle les erreurs sont écrites*/
	string nom_func;/*Le nom de la fonction */

public:
//Constructeurs -------------------------------------------
/*!
 * \brief Constructeur vide
 */
fonction();

/*!
 * \brief Constructeur
 * 
 * \param rk : la ligne de déclaration
 * \param nom : le nom de la fonction
 * \param S : le flux Erreur
 */
fonction(int rk, const string& nom, stringstream& S);

/*!
 * \brief Constructeur par recopie
 */
fonction(const fonction & f);

//Getters

/*!
 * \brief Getter du nom de la fonction
 * \return la valeur de nom_func
 */
const string & getName();

/*!
 * \brief Validité de la fonction
 * \return la valeur de valide
 */
bool isValid();

/*!
 * \brief Affichage des paramètres
 */
void printParameter();

/*!
 * \brief Affichage des instructions
 */
void listInstructions();

/*!
 * \brief Vérification de la consistance d'une variable
 * \return true si la variable à déjà été déclarée dans la fonction
 */
bool checkVar(const string & nomvar);

/*!
 * \brief Vérification de la consistance d'une fonction
 * \return true si la fonction est accessible dans la fonction
 */
bool checkFonction(const string & nomvar);

/*!
 * \brief Nombre de paramètres de la fonction nomvar
 */
int getNbParaFonction(const string & nomvar);

/*!
 * \brief Vérification de l'initialisation d'une variable
 * \return true si la variable à déjà été initialisée dans la fonction
 */
bool isInitialized(const string & nomvar);


//Modifiers------------------------------------------------
/*!
 * \brief Ajout d'une variable à la fonction
 * \param nom_var: le nom du paramètre
 */
void addVariable(const string & nom_var);

/*!
 * \brief "Initialise" la variable dans la fonction
 * \param nom_var: le nom du paramètre
 */
void initialize(const string & nomvar);

/*!
 * \brief Ajout d'un paramètre à la fonction
 * \param nom_var: le nom du paramètre
 */
void addParameter(const string & nom_var);

/*!
 * \brief Ajout d'une fonction accessible à la fonction
 * \param nom_var: le nom de la fonction
 * \param nbPara : le nombre de paramètres de la fonction
 */
void addFonction(const string & nom_var, int nbPara);

/*!
 * \brief Ajout d'une chaine-instruction lobo à la fonction
 * \param rang: le numéro de ligne
 * \param typ: le tyoe d'instruction
 * \param inst: le contenu de l'instruction
 */
void addInstruction(int rang, const string& typ, const string& inst);

/*!
 * \brief Traduction de la fonction
 * \return valeur de fonction_traduite
 */
fonctioncpp translate();

/*!
 * \brief Ecrire sur flux_erreur
 * \param message: le message à écrire
 */
const void errorLog(const string& message);

};

#endif // FONCTION_H
